home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Night Owl 6
/
Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso
/
038a
/
ike.zip
/
ICO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-08
|
19KB
|
537 lines
/*===========================================================================*/
/* */
/* File : ICO.C */
/* */
/* Purpose : Main routine for the IKE icon editor. */
/* */
/* History : */
/* */
/* (C) Copyright 1991 Marc Adler/Magma Systems All Rights Reserved */
/*===========================================================================*/
#include <memory.h>
#include <string.h>
#include <windows.h>
#include "ico.h"
HWND hWndMain;
HWND hWndEdit;
HWND hWndDebug;
HWND hWndActualImage;
HANDLE hInst = 0;
HANDLE hAccTable;
ICONHEADER IconHeader;
ICONDIRECTORY IconDir;
ICONINFO IconInfo =
{
NULL, NULL, 0, '\0'
};
BYTE rgb[16][3] =
{ /* B G R */
{ 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x80 },
{ 0x00, 0x80, 0x00 },
{ 0x00, 0x80, 0x80 },
{ 0x80, 0x00, 0x00 },
{ 0x80, 0x00, 0x80 },
{ 0x80, 0x80, 0x00 },
{ 0x80, 0x80, 0x80 },
{ 0xC0, 0xC0, 0xC0 },
{ 0x00, 0x00, 0xFF },
{ 0x00, 0xFF, 0x00 },
{ 0x00, 0xFF, 0xFF },
{ 0xFF, 0x00, 0x00 },
{ 0xFF, 0x00, 0xFF },
{ 0xFF, 0xFF, 0x00 },
{ 0xFF, 0xFF, 0xFF }
};
/****************************************************************************/
/* */
/* Function : WinMain() */
/* */
/* Purpose : Entry point for a Windows app. */
/* */
/* Returns : */
/* */
/****************************************************************************/
int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
HANDLE hInstance;
HANDLE hPrevInstance;
LPSTR lpCmdLine;
int nCmdShow;
{
HWND hWnd;
MSG msg;
char szFileName[80];
if (!hPrevInstance) /* Has application been initialized? */
if (!ICOViewInit(hInstance))
return (NULL); /* Exits if unable to initialize */
hInst = hInstance; /* Saves the current instance */
/*
Create the main window.
*/
hWnd = CreateWindow("ICOView",
"ICOView",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
#ifdef DEBUG
600,
#else
520,
#endif
424,
NULL,
NULL,
hInstance,
NULL);
if (!(hWndMain = hWnd))
return (NULL);
#ifdef DEBUG
/*
Create a debugging window.
*/
hWndDebug = CreateWindow("ICODbg",
"ICODbg",
WS_OVERLAPPEDWINDOW | WS_CHILD |
WS_VISIBLE | WS_CLIPSIBLINGS,
280, 0, 400, 400,
hWnd,
16,
hInstance,
NULL);
#endif
/*
Create the icon editing window
*/
hWndEdit = CreateWindow("IconEdit",
(LPSTR) "Edit",
WS_CHILD | WS_BORDER | WS_VISIBLE,
5, 2,
32*8 + 2*GetSystemMetrics(SM_CXBORDER),
32*8 + 2*GetSystemMetrics(SM_CYBORDER),
hWnd,
1,
hInstance,
(LPSTR) NULL);
if (!hWndEdit)
{
MessageBox(hWnd, "Can't create hWndEdit", NULL, MB_OK);
return NULL;
}
/*
Create the window which will hold the actual icom image (32x32)
*/
hWndActualImage = CreateWindow("IconImage",
(LPSTR) NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE,
300, 100,
32 + 2*GetSystemMetrics(SM_CXBORDER),
32 + 2*GetSystemMetrics(SM_CYBORDER),
hWnd,
2,
hInstance,
(LPSTR) NULL);
if (!hWndActualImage)
{
MessageBox(hWnd, "Can't create hWndActualImage", NULL, MB_OK);
return NULL;
}
/*
Initialize the toolbox
*/
ToolboxInit(hWndMain);
/*
The Paste option is initially disabled since there is nothing in
the paste buffer. (An enhancement would be to make the paste buffer
shared between instances.)
*/
EnableMenuItem(GetMenu(hWndMain), IDM_PASTE,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
/*
Create a blank icon to start off with.
*/
NewIcon();
/*
Read in any icon file which may have been passed on the command line.
*/
if (lpCmdLine && *lpCmdLine)
{
lstrcpy(szFileName, lpCmdLine);
if (strchr(szFileName, '.') == NULL)
strcat(szFileName, ".ico");
ICORead(hWndEdit, szFileName);
}
/*
Main message loop...
*/
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
/****************************************************************************/
/* */
/* Function : ICOViewInit() */
/* */
/* Purpose : Registers all of the classes used by the icon editor. */
/* */
/* Returns : TRUE if successful, FALSE if not. */
/* */
/****************************************************************************/
BOOL ICOViewInit(hInstance)
HANDLE hInstance;
{
HANDLE hMemory;
WNDCLASS *pWndClass;
BOOL bSuccess;
hMemory = LocalAlloc(LPTR, sizeof(WNDCLASS));
pWndClass = (PWNDCLASS) LocalLock(hMemory);
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(hInstance, "IKE");
pWndClass->lpszMenuName = (LPSTR) "IconEdit";
pWndClass->lpszClassName = (LPSTR) "ICOView";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICOViewWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
pWndClass->hCursor = (HICON) NULL;
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "IconEdit";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICOEditWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "IconImage";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICOImageWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "ToolBox";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ToolBoxWndProc;
pWndClass->cbWndExtra = sizeof(HANDLE);
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
#ifdef DEBUG
pWndClass->hCursor = (HICON) NULL;
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "IcoDbg";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICODebugWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
#endif
LocalUnlock(hMemory);
LocalFree(hMemory);
return bSuccess;
}
/****************************************************************************/
/* */
/* Function : NewIcon() */
/* */
/* Purpose : Initializes a brand new icon. */
/* */
/* Returns : Nothing. */
/* */
/****************************************************************************/
VOID PASCAL NewIcon(void)
{
LPSTR lpBits;
LPBITMAPINFO lpbmi;
/*
Set up the icon header
*/
IconHeader.icoReserved = 0;
IconHeader.icoResourceType = 1;
IconHeader.icoResourceCount = 1;
/*
Set up a directory entry for a single icon
*/
IconDir.Width = 32;
IconDir.Height = 32;
IconDir.ColorCount = 16;
IconDir.bReserved1 = 0;
IconDir.bReserved2 = 0;
IconDir.bReserved3 = 0;
IconDir.icoDIBSize = 744;
IconDir.icoDIBOffset = 22;
/*
Set up the icon info structure
*/
if (IconInfo.hBitmapBits)
GlobalFree(IconInfo.hBitmapBits);
if (IconInfo.hBitmapInfo)
GlobalFree(IconInfo.hBitmapInfo);
IconInfo.hIcon = NULL;
IconInfo.hBitmapBits = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 32L*32L);
IconInfo.fFlags = 0;
IconInfo.szFilename[0] = '\0';
/*
The initial pixmap contains all FF's (ie - it's all white)
*/
lpBits = GlobalLock(IconInfo.hBitmapBits);
_fmemset(lpBits, 0xFF, 32*32);
GlobalUnlock(IconInfo.hBitmapBits);
IconInfo.hBitmapInfo = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
(DWORD) sizeof(BITMAPINFOHEADER) + 16*sizeof(RGBQUAD));
lpbmi = (LPBITMAPINFO) GlobalLock(IconInfo.hBitmapInfo);
lpbmi->bmiHeader.biSize = (long) sizeof(BITMAPINFOHEADER);
lpbmi->bmiHeader.biWidth = IconDir.Width;
lpbmi->bmiHeader.biHeight = IconDir.Height;
lpbmi->bmiHeader.biPlanes = 1;
lpbmi->bmiHeader.biBitCount = ColorCountToPlanes(IconDir.ColorCount);
lpbmi->bmiHeader.biCompression = BI_RGB;
lpbmi->bmiHeader.biSizeImage = 0L;
lpbmi->bmiHeader.biXPelsPerMeter = 0;
lpbmi->bmiHeader.biYPelsPerMeter = 0;
lpbmi->bmiHeader.biClrUsed = 0;
lpbmi->bmiHeader.biClrImportant = 0;
/*
Initialize the colors
*/
if (IconDir.ColorCount == 2)
{
_fmemcpy((LPSTR) &lpbmi->bmiColors[0], rgb[0], 3);
_fmemcpy((LPSTR) &lpbmi->bmiColors[1], rgb[7], 3);
}
else
{
int i;
for (i = 0; i < 16; i++)
_fmemcpy((LPSTR) &lpbmi->bmiColors[i], rgb[i], 3);
}
GlobalUnlock(IconInfo.hBitmapInfo);
/*
No undo info yet...
*/
EnableMenuItem(GetMenu(hWndMain), IDM_UNDO,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
/****************************************************************************/
/* */
/* UTILITY ROUTINES */
/* */
/* */
/****************************************************************************/
/****************************************************************************/
/* */
/* Function : ColorCountToPlanes() */
/* */
/* Purpose : Given a number of colors, returns the number of color planes */
/* needed to represent those colors (log2(Colors)) */
/* */
/* Returns : The number of planes in the pixmap. */
/* */
/****************************************************************************/
int PASCAL ColorCountToPlanes(int nClr)
{
switch (nClr)
{
case 2 : return 1;
case 8 : return 3;
case 16: return 4;
default: return 1;
}
}
/****************************************************************************/
/* */
/* Function : SetIconPixel() */
/* */
/* Purpose : Sets the nibble in the pixmap which corresponds to location */
/* (x,y) to the passed color. */
/* */
/* Returns : Zippo. */
/* */
/****************************************************************************/
VOID PASCAL SetIconPixel(int x, int y, int iColor)
{
LPSTR lpBits, lpByte;
int nPixelsPerByte = 2;
if (IconInfo.hBitmapBits == NULL)
return;
/*
Dereference the pixmap and point to the proper location
*/
lpBits = GlobalLock(IconInfo.hBitmapBits);
lpByte = lpBits + ((31-y) * IconDir.Width / nPixelsPerByte) +
(x / nPixelsPerByte);
/*
Set the left or right nibble, depending if the x value is odd or even.
*/
if (x & 1)
*lpByte = (*lpByte & 0xF0) | (BYTE) iColor;
else
*lpByte = (*lpByte & 0x0F) | ((BYTE) iColor << 4);
GlobalUnlock(IconInfo.hBitmapBits);
}
/****************************************************************************/
/* */
/* Function : GetIconPixel() */
/* */
/* Purpose : Reads the pixel at location [x,y]. */
/* */
/* Returns : The color of the pixel at location [x,y]. */
/* */
/****************************************************************************/
int PASCAL GetIconPixel(int x, int y)
{
LPSTR lpBits, lpByte;
int nPixelsPerByte = 2;
if (IconInfo.hBitmapBits == NULL)
return 0;
/*
Dereference the pixmap and point to the proper location
*/
lpBits = GlobalLock(IconInfo.hBitmapBits);
lpByte = lpBits + ((31-y) * IconDir.Width / nPixelsPerByte) +
(x / nPixelsPerByte);
/*
If it's an odd column, get the left nibble, else the right one.
*/
if (x & 1)
x = (*lpByte & 0xF0) >> 4;
else
x = (*lpByte & 0x0F);
GlobalUnlock(IconInfo.hBitmapBits);
return x;
}
/****************************************************************************/
/* */
/* Function : IconPlotLine() */
/* */
/* Purpose : This is a callback for the LineDDA(). We can set the */
/* pixel at (x,y) to the passed color. */
/* */
/* Returns : Zilch. */
/* */
/****************************************************************************/
VOID FAR PASCAL IconPlotLine(int x, int y, LPSTR lpData)
{
if ((x /= 8) > 31)
x = 31;
if ((y /= 8) > 31)
y = 31;
SetIconPixel(x, y, LOWORD(((LONG) lpData)));
}
/****************************************************************************/
/* */
/* Function : DebugBitmap() */
/* */
/* Purpose : Dumps a hex representation of the pixmap to the debugging */
/* window. */
/* */
/* Returns : Nada. */
/* */
/****************************************************************************/
#ifdef DEBUG
DebugBitmap(HWND hWnd, HANDLE hBits)
{
int x, y;
LPSTR p;
char buf[8];
HDC hDC;
TEXTMETRIC tm;
p = GlobalLock(hBits);
hDC = GetDC(hWnd);
GetTextMetrics(hDC, (LPTEXTMETRIC) &tm);
for (y = 0; y < 32; y++)
{
for (x = 0; x < 16; x++)
{
sprintf(buf, "%02x ", (unsigned char) *p++);
TextOut(hDC, x*3 * tm.tmAveCharWidth, y * (tm.tmHeight),
(LPSTR) buf, 3);
}
}
GlobalUnlock(hBits);
ReleaseDC(hWnd, hDC);
}
#endif